package gspushmq.util;


import ggframework.mongodb.BasicDBObject;
import ggframework.mongodb.DBCollection;
import ggframework.mongodb.DBCursor;
import ggframework.mongodb.DBObject;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 交易日期类
 * 
 * @version 1.0
 * @since JDK1.7
 * @author Albert
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2014 SunTime Co'Ltd Inc. All rights reserved.
 * @date 2014年1月14日 下午2:47:39
 */
public class GGDate implements Serializable {
	private static final long serialVersionUID = 1L;

	private Long id;
	/**
	 * 日期(日期型)
	 */
	private Date cdate;
	/**
	 * 最后有效交易日
	 */
	private Date cldate;
	private Date clcloseDate;
	/**
	 * 是否交易日
	 */
	private Integer isEdate;
	/**
	 * 入库日期
	 */
	private Date entryDate;
	private Long tmstamp;
	
	/**
	 * 获取统计日最新的交易日期
	 * 
	 * @param countDate 统计日(格式：yyyy-MM-dd)
	 * @return 统计日最新的交易日期
	 *
	 * @author Albert
	 * @date 2014年1月14日 下午3:04:27
	 */
	public static Date getLastExchangeData(String countDate) {
		Date date = DateUtil.stringToDate(countDate, "yyyy-MM-dd");
		return getLastExchangeData(date);
	}
	
	/**
	 * 获取统计日最新的交易日期
	 * 
	 * @param countDate 统计日
	 * @return 统计日最新的交易日期
	 *
	 * @author Albert
	 * @date 2014年1月14日 下午3:04:27
	 */
	public static Date getLastExchangeData(Date countDate) {
		Date date = DateUtil.getEndOfDay(countDate);
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBCursor cursor = collection.find(
				new BasicDBObject("cdate", new BasicDBObject("$lte", date)).append("is_edate", 1))
			.sort(new BasicDBObject("cdate", -1)).limit(1);
		Date cd = null;
		if(cursor.hasNext()) {
			cd = (Date) cursor.next().get("cdate");
		}
		cursor.close();
		return cd;
	}
	
	public static List<Date> getLastExchangeDatas(Date countDate, int days) {
		Date date = DateUtil.getEndOfDay(countDate);
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBCursor cursor = collection.find(
				new BasicDBObject("cdate", new BasicDBObject("$lte", date)).append("is_edate", 1))
			.sort(new BasicDBObject("cdate", -1)).limit(days);
		List<Date> cd = new ArrayList<>();
		while (cursor.hasNext()) {
			cd.add(cursor.next().getDate("cdate"));
		}
		cursor.close();
		return cd;
	}
	
	/**
	 * 获取统计日最新的交易日期 前n个交易日
	 * days  1 代表前一个交易日 
	 * @param countDate 统计日
	 * @return 统计日最新的交易日期
	 * @author wuzs
	 * @date 2017年10月16日 下午3:04:27
	 */
	public static Date getLastExchangeData(Date countDate,int days) {
		Date date = DateUtil.getEndOfDay(countDate);
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBCursor cursor = collection.find(
				new BasicDBObject("cdate", new BasicDBObject("$lte", date)).append("is_edate", 1))
			.sort(new BasicDBObject("cdate", -1)).limit(days);
		Date cd = null;
		while (cursor.hasNext()) {
			cd = (Date) cursor.next().get("cdate");
			//System.out.println(cd);
		}
		cursor.close();
		return cd;
	}
	/**
	 * 
	 *获取开始日期的最近的下一个交易日（包括自己）
	 *
	 * @param startDate 开始日期
	 * @return
	 * 
	 * @author yaoqiang
	 * @date 2014年12月31日 上午10:15:55
	 */
	public static Date getNextExchangeData(String startDate) {
		Date date = DateUtil.stringToDate(startDate, "yyyy-MM-dd");
		return getNextExchangeDate(date);
	}
	
	/**
	 * 
	 * 获取开始日期的最近的下一个交易日（包括自己）
	 *
	 * @param startDate 统计开日期
	 * @return
	 * 
	 * @author yaoqiang
	 * @date 2014年12月31日 上午10:13:15
	 */
	public static Date getNextExchangeDate(Date startDate){
		if(startDate == null){
			return null;
		}
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBCursor cursor = collection.find(
				new BasicDBObject("cdate", new BasicDBObject("$gte", startDate)).append("is_edate", 1))
			.sort(new BasicDBObject("cdate", 1)).limit(1);
		Date cd = null;
		if(cursor.hasNext()) {
			cd = (Date) cursor.next().get("cdate");
		}
		cursor.close();
		return cd;
	}
	
	/**
	 * 
	 * 获取从开始日期到结束日期所有交易日日期
	 *
	 * @param startDate
	 * @param endDate
	 * @return
	 * 
	 * @author yaoqiang
	 * @date 2015年2月2日 下午1:42:11
	 */
	public static List<String> getDates(String startDate,String endDate,Integer order,Integer isedate){
		
		return getDates(DateUtil.stringToDate(startDate, "yyyy-MM-dd")
					,DateUtil.stringToDate(endDate, "yyyy-MM-dd"),order,isedate);
	}
	
	public static List<String> getDates(Date startDate, Date endDate){
		return getDates(startDate,endDate,-1,1);
	}
	/**
	 * 
	 * 获取从开始日期到结束日期所有交易日日期
	 *
	 * @param startDate
	 * @param endDate
	 * @return
	 * 
	 * @author yaoqiang
	 * @date 2015年2月2日 下午1:46:12
	 */
	public static List<String> getDates(Date startDate, Date endDate,Integer order,Integer isedate){
		if(startDate == null || endDate == null){
			return null;
		}
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBObject query = new BasicDBObject("cdate", new BasicDBObject("$gte", startDate).append("$lte", endDate));
		if(isedate == 1){
			query.put("is_edate", 1);
		}
		DBCursor cursor = collection.find(query).sort(new BasicDBObject("cdate", order));
		List<String> result = new ArrayList<String>();
		while(cursor.hasNext()){
			result.add(DateUtil.dateToString((Date) cursor.next().get("cdate"),"yyyy/MM/dd"));
		}
		cursor.close();
		return result;
	}
	
	/**
	 * 
	 * 获取date 第count个交易日的时间
	 *
	 * @param date 
	 * @param count 
	 * @return
	 * 
	 * @author yaoqiang
	 * @date 2015年4月30日 上午10:00:40
	 */
	public  static Date getExchangeDateService(Date date, Integer count){
		if(date == null){
			date=DateUtil.getNowDate();
		}
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBCursor cursor = collection.find(
				new BasicDBObject("cdate", new BasicDBObject(count > 0 ? "$gte" : "$lte", date)).append("is_edate", 1))
			.sort(new BasicDBObject("cdate", count > 0 ? 1 : -1)).skip(Math.abs(count)).limit(1);
		Date cd = null;
		if(cursor.hasNext()) {
			cd =(Date) cursor.next().get("cdate");
		}
		cursor.close();
		return cd;
	}
	//
	public  static Date getBeforeExchangeDateService(Date date){
		if(date == null){
			date=DateUtil.getNowDate();
		}
		DBCollection collection = MongoUtil.getGGStockBaseCollection("gg_date");
		DBCursor cursor = collection.find(
				new BasicDBObject("cdate", new BasicDBObject("$lte", date)).append("is_edate", 1))
			.sort(new BasicDBObject("cdate",  -1)).limit(1);
		Date cd = null;
		if(cursor.hasNext()) {
			cd =(Date) cursor.next().get("cdate");
		}
		cursor.close();
		return cd;
	}
	

	
	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}

	public Date getCdate() {
		return cdate;
	}
	
	public void setCdate(Date cdate) {
		this.cdate = cdate;
	}

	public Integer getIsEdate() {
		return isEdate;
	}

	public void setIsEdate(Integer isEdate) {
		this.isEdate = isEdate;
	}
	
	public Date getEntryDate() {
		return entryDate;
	}
	
	public void setEntryDate(Date entryDate) {
		this.entryDate = entryDate;
	}

	public Date getCldate() {
		return cldate;
	}
	
	public void setCldate(Date cldate) {
		this.cldate = cldate;
	}

	public Date getClcloseDate() {
		return clcloseDate;
	}
	
	public void setClcloseDate(Date clcloseDate) {
		this.clcloseDate = clcloseDate;
	}

	public Long getTmstamp() {
		return tmstamp;
	}

	public void setTmstamp(Long tmstamp) {
		this.tmstamp = tmstamp;
	}
	
}
